/**
 * @file regroupement.h
 * @brief Fichier d'entête du module regroupement.
 *
 * @author Delory Rachid, Keita Mamadou, Bernard Florian
 */
#ifndef H_REGROUPEMENT_H
#define H_REGROUPEMENT_H

/* *********************************************************************
                                                                       
                   Librairies de Regroupement                          
                                                                       
********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "date.h"
#include "ensemble.h"
#include "genre.h"

/* *********************************************************************

                        Définitions de types                          

********************************************************************* */

/**
 * @struct sRegroupement
 * @brief Structure utilisée pour la gestion d'un regroupement.
 *
 * Cette structure est utilisée pour gérer un regroupement.
 Les champs de cette structures doivent être modifiés ou lus
 par les accesseurs et mutateurs.
 */

struct sRegroupement {
  
  unsigned int id; /** Identifiant du regroupement */
  char * illustration; /** Nom de l'illustration */
  char * titre; /** Titre du regroupement */
  int type; /** Type du regroupement pour discocié un album du reste */
  char * commentaire; /** Description du regroupement */
  Date * creation; /** Date de création du regroupement */
  Ensemble * eGenre; /** Une liste de genre associée au regroupement */
  char maj;
  char sup;
} ;

/**
 * @typedef Regroupement
 * @brief Redéfinit la structure sRegroupement.
 */
typedef struct sRegroupement Regroupement ;



/* *********************************************************************

                Fonctions relatives aux regroupement                      

********************************************************************* */

/**
 * @fn Regroupement * creer_Reg () ;
 * @brief Creer un regroupement.
 *
 * @return Regroupement Pointeur sur Regroupement créer en mémoire.
 */
Regroupement * creer_Reg() ;

/**
 * @fn void detruire_Reg (Regroupement ** regrp) ;
 * @brief Supprime un regroupement.
 *
 * @param[in,out] regrp Pointeur vers le regroupement à supprimer
 */
void detruire_Reg(Regroupement ** regrp) ;

/**
 * @fn void init_Reg(Regroupement * regrp) ;
 * @brief Initialise un regroupement.
 *
 * @param[in,out] regrp Pointeur vers le regroupement à initialiser.
 */
void init_Reg(Regroupement * regrp) ;

/**
 * @fn void liberer_Reg (Regroupement * regrp)
 * @brief Libère un regroupement de la mémoire.
 *
 * @param[in,out] regrp Pointeur vers le regroupement à libérer.
 */
void liberer_Reg(Regroupement *regrp) ;

/**
 * @fn void copier_Reg(Regroupement * regrpDest, const Regroupement * regrpSrc) ;
 * @brief Copie membre à membre en regroupement
 *
 * @param[in,out] regrpDest pointeur vers le regroupement de destination
 * @param regrpSrc pointeur source
 */
void copier_Reg(Regroupement ** regrpDest, const Regroupement * regrpSrc);

/* ********************************************************************* 

           Accesseurs et Mutateurs de la structure sRegroupement             

********************************************************************* */

/**
 * @fn unsigned int getId_Reg(const Regroupement *regrp)
 * @brief Récupère l'id du regroupement en vérifiant sa validité.
 *
 * @param regrp Pointeur vers le regroupement.
 * @return unsigned int La valeur de l'ID.
 */
unsigned int getId_Reg(const Regroupement *regrp) ;


/**
 * @fn void setId_Reg(Regroupement *regrp, const unsigned int id) ;
 * @brief Modifie l'ID du regroupement sélectioné.
 *
 * @param[in,out] regrp Pointeur vers le regroupement.
 * @param id Valeur du Nouvel id du regroupement selectioné.
 */
void setId_Reg(Regroupement *regrp, const unsigned int id) ;

/**
 * @fn char * getIllustration_Reg(const Regroupement *regrp)
 * @brief Récupère l'illustration du regroupement en vérifiant sa validité.
 *
 * @param regrp Pointeur vers le regroupement.
 * @return char Le chemin de l'illustration.
 */
char * getIllustration_Reg(const Regroupement *regrp) ;


/**
 * @fn void setIllustration_Reg(Regroupement *regrp, const char * illustration) ;
 * @brief Modifie l'illustration du regroupement sélectioné.
 *
 * @param[in,out] regrp Pointeur vers le regroupement.
 * @param illustration chemin de la Nouvel illustration du regroupement.
 */
void setIllustration_Reg(Regroupement *regrp, const char * illustration) ;

/**
 * @fn char * getTitre_Reg(const Regroupement *regrp)
 * @brief Récupère le titre du regroupement en vérifiant sa validité.
 *
 * @param regrp Pointeur vers le regroupement.
 * @return char le titre du regroupement sélectioné.
 */
char * getTitre_Reg(const Regroupement *regrp) ;


/**
 * @fn void setTitre_Reg(Regroupement *regrp, const char * titre) ;
 * @brief Modifie le titre du regroupement sélectioné.
 *
 * @param[in,out] regrp Pointeur vers le regroupement.
 * @param titre Nouveau titre du regroupement.
 */
void setTitre_Reg(Regroupement *regrp, const char * titre) ;


/**
 * @fn unsigned int getType_Reg(const Regroupement *regrp)
 * @brief Récupère le type du regroupement en vérifiant sa validité.
 *
 * @param regrp Pointeur vers le regroupement.
 * @return char le type du regroupement sélectioné.
 */
unsigned int getType_Reg(const Regroupement *regrp) ;


/**
 * @fn void setType_Reg(Regroupement *regrp, const unsigned int type) ;
 * @brief Modifie le type du regroupement sélectioné.
 *
 * @param[in,out] regrp Pointeur vers le regroupement.
 * @param type Nouveau type du regroupement.
 */
void setType_Reg(Regroupement *regrp, const unsigned int type) ;

/**
 * @fn char * getCommentaire_Reg(const Regroupement *regrp)
 * @brief Récupère le commentaire du regroupement en vérifiant sa validité.
 *
 * @param regrp Pointeur vers le regroupement.
 * @return unsigned char * Pointeur sur le commentaire du regroupement sélectioné.
 */
char * getCommentaire_Reg(const Regroupement *regrp) ;


/**
 * @fn void setCommentaire_Reg(Regroupement *regrp, const char * commentaire) ;
 * @brief Modifie le commentaire du regroupement sélectioné.
 *
 * @param[in,out] regrp Pointeur vers le regroupement.
 * @param commentaire Nouveau commentaire du regroupement.
 */
void setCommentaire_Reg(Regroupement *regrp, const char * commentaire) ;

/**
 * @fn Date getCreation_Reg(const Regroupement *regrp)
 * @brief Récupère l'creation du regroupement en vérifiant sa validité.
 *
 * @param regrp Pointeur vers le regroupement.
 * @return Date le chemin de l'creation.
 */
Date * getCreation_Reg(const Regroupement *regrp) ;


/**
 * @fn void setCreation_Reg(Regroupement *regrp, const Date creation) ;
 * @brief Modifie la date de creation du regroupement sélectioné.
 *
 * @param[in,out] regrp Pointeur vers le regroupement.
 * @param creation Nouvelle date de création du regroupement.
 */
void setCreation_Reg(Regroupement *regrp, const Date * creation) ;

/**
 * @fn Ensemble * getEnsembleGenre_Reg(const Regroupement *regrp) ;
 * @brief Retourne le pointeur sur l'ensemble genre afin d'y faire des modifications ou de les afficher
 *
 * @param regrp Regroupement contenant l'ensemble de genre
 * @return Ensemble * Un pointeur sur l'ensemble de genre
 */
Ensemble * getEnsembleGenre_Reg(const Regroupement *regrp) ;

/**
 * @fn void setMaj_Reg(Regroupement *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Reg(Regroupement *ptr, const char b);

/**
 * @fn char getMaj_Reg(const Regroupement *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Reg(const Regroupement *ptr);

/**
 * @fn void setSup_Reg(Regroupement *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Reg(Regroupement *ptr, const char b);

/**
 * @fn char getSup_Reg(const Regroupement *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Reg(const Regroupement *ptr);

/* ********************************************************************* 

                       Test de Non Régression

********************************************************************* */

/**
 * @fn void testRegression_Reg(void)
 * @brief Teste toutes les fonctions du module Regroupement.
 */
void regression_Reg();


#endif
